.___ _________ .__ .__ ___. | | ____ ____ \_ ___ \| | |__| _____\_ |__ ___________ | |/ ___\/ __ \ / \ \/| | | |/ \| __ \_/ __ \_ __ \ | \ \__\ ___/ \ \___| |_| | Y Y \ \_\ \ ___/| | \/ |___|\_____>_____> \________/____/__|__|_|__/_____/\_____>__| ICE CLIMBER - LEVEL DATA MAP Version 1.0 by Issun (2018-02-08) -------------------------------------------------------------------------------- -- INTRODUCTION ---------------------------------------------------------------- -------------------------------------------------------------------------------- Seeing how little had been documented about my favorite NES game I decided to reverse engineer the level data. The code is both beautiful and clever and I learned a lot about this little gem. Like how it has only 16 mountain maps that are reused for the later 16 mountains as well, by using modifiers and walls they manage to make them seem like totally different maps altogether. Almost like a "second quest". ;) This document should contain all the information you need to make custom stages including bonus stages. Enjoy! -------------------------------------------------------------------------------- -- TABLE OF CONTENTS ----------------------------------------------------------- -------------------------------------------------------------------------------- NORMAL STAGES: META TILES [META] MAPS [MAPS] WALLS [WALL] MODIFIERS [MODI] BONUS STAGES: PLATFORMS [PLAT] CLOUDS [CLOU] VEGETABLES [VEGE] -------------------------------------------------------------------------------- -- NORMAL STAGE - META TILES [META] -------------------------------------------- -------------------------------------------------------------------------------- Each Meta Tile is 3 bytes in size with 1 bit per Tile for a total of 24 Tiles. There are a total of 16 of these Meta Tiles. '1' represents a block of ice and '0' represents open space. These are located in ROM: $0522-$0551 (CPU: $C512-$C541) [3x16 = 48 bytes] Here follows a visual representation of all 16 Meta Tiles: (#: ice, -: open space) META TILE 0: ------------------------ META TILE 1: ######################## META TILE 2: ####--#####--#####--#### META TILE 3: --##--##--##--##--##--## META TILE 4: ----####----####----#### META TILE 5: --##--##--------##--##-- META TILE 6: ########----############ META TILE 7: ##----########----###### META TILE 8: ####----####----####---- META TILE 9: ####----------------#### META TILE A: ##--######--####--###### META TILE B: ####------------######## META TILE C: ##--##--##--##--##--##-- META TILE D: ####--##--##--##-------- META TILE E: ######--######--######## META TILE F: ######------------###### There are two layers of ice on each Floor (except Floor 1). The first layer is made up with the 'Meta Tiles' above and the bottom layer is randomly generated with gaps where the first layer above has open space. -------------------------------------------------------------------------------- -- NORMAL STAGE - MAPS [MAPS] -------------------------------------------------- -------------------------------------------------------------------------------- The game features 32 Mountains, but there are only 16 Mountain 'Maps'. This is because the game uses the first 16 Maps for the later half of the Mountains as well. With clever use of Modifiers (see [MODI]) and Walls (see [WALL]), Mountain 17-32 still appear very different from the first 16 Maps. Every Mountain Map is only 4 bytes in size and these are stored in the following way: The first byte of Mountain 1-16 ROM: $2472-$2481 [16 bytes] (CPU: $E462-$E471) The second byte of Mountain 1-16 ROM: $2482-$2491 [16 bytes] (CPU: $E472-$E481) The third byte of Mountain 1-16 ROM: $2492-$24A1 [16 bytes] (CPU: $E482-$E491) The fourth byte of Mountain 1-16 ROM: $24A2-$24B1 [16 bytes] (CPU: $E792-$E4A1) Every Mountain has got 8 Floors and every Floor uses 4 bits, a Meta Tile Index. These are not stored in nybbles, instead each Floor takes one bit from each Map byte like so: BYTE 1 BYTE 2 BYTE 3 BYTE 4 BITS 12345678 12345678 12345678 12345678 FLOOR 1: ^ ^ ^ ^ FLOOR 2: ^ ^ ^ ^ FLOOR 3: ^ ^ ^ ^ ... ------------------------------------------------------------------------------- : NOTE: : : : : Although the 4 bytes contain a Meta Tile Index for Floor 1, that Floor is : : actually hard-coded and will always use Meta Tile $01 on every Mountain. : : : : If you would like to change which Meta Tile that is used for the first : : Floor of every Mountain, you can simply change ROM:$2795 (CPU:$E785) to any : : value between $00-$0F. : : : ------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- NORMAL STAGE - WALLS [WALL] ------------------------------------------------- -------------------------------------------------------------------------------- Walls can be used on each of the 32 individual Mountains in the game and they use two tables. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The first Table is located in ROM: $1F0A-$1F2A (CPU: $DEFA-$DF1A) [33 bytes] It is indexed by Mountain (0-31) and each entry holds the index for the first Wall that any specific Mountain uses. If the next entry is the same as the current entry then the current Mountain uses no walls at all. In that case the current entry holds the first Wall to be used by the next Mountain that actually has Walls. To illustrate this with an example: If Mountain 1 has got 0 walls the 1st entry will be $00 <-No walls If Mountain 2 has got 0 walls the 2nd entry will be $00 <-No walls If Mountain 3 has got 2 walls the 3rd entry will be $00 <-Wall 0,1 If Mountain 4 has got 4 walls the 4th entry will be $02 <-Wall 2,3,4,5 If Mountain 5 has got 0 walls the 5th entry will be $06 <-No walls If Mountain 6 has got 2 walls the 6th entry will be $06 <-Wall 6,7 7th entry... $08 As you can see the game always need an additional entry beyond the indexed one hence the Table being 33 bytes in size. --------------------------------------------------------------------------- : To get the amount of Walls for any given Mountain, subtract its entry : : from the next one. The difference between them are the amount of Walls : : on that Mountain. : --------------------------------------------------------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The second Table is located in ROM: $1F2C-$1FB4 (CPU: $DF1C-$DFA4) [137 bytes] This Table holds the 'Walls' themselves, each is 1 byte in size and there's room for a total of 137 Walls inside the ROM. The format of each Wall is the following: %FFFX XXXX F Which Floor (1-7) X X-position of the Wall (0-23 for Floor 1 & 2) (1-22 for Floor 3,4,5) (2-21 for Floor 6,7) It's not possible to have Walls on Floor 8. Floors get narrower further up the Mountain, that's why there's a different X-position range for Floor 3,4,5 and 6,7. -------------------------------------------------------------------------------- -- NORMAL STAGE - MODIFIERS [MODI] --------------------------------------------- -------------------------------------------------------------------------------- Floor Modifiers are a powerful tool to change the properties of a Floor. You can change the Floor Type to make the Ground Normal/Moving or even have Clouds. You can also make the Ground Breakable/Unbreakable. All 32 Mountains have got 7 Floor Modifiers each, these are only for Floor 2-8, Floor 1 is fixed and can't use any. The Floor Modifiers are 1 byte in size and can be found at: ROM: $2392-$2471 (CPU: $E382-$E461) [7x32 = 224 bytes] The format of each Floor Modifier is the following: %TTTT BSSS T The Floor Type B Determines if the Ground is Breakable (0) or Unbreakable (1) SSS Cloud/Moving Floor Speed from 0 = Slowest to 7 = Fastest These are the Floor Types (T): T GROUND CLOUDS SIDES ---------------------------------------------- 0 NORMAL NONE OPEN 1 - - - 2 MOVING RIGHT NONE OPEN 3 MOVING LEFT NONE OPEN 4 - - - 5 - - - 6 MOVING RIGHT BIG CLOUD LEFT OPEN 7 MOVING LEFT BIG CLOUD RIGHT OPEN 8 NORMAL BIG CLOUD LEFT OPEN 9 NORMAL BIG CLOUD RIGHT OPEN A NO GROUND BIG CLOUD LEFT CLOSED B NO GROUND BIG CLOUD RIGHT CLOSED C NO GROUND MEDIUM CLOUD LEFT CLOSED D NO GROUND MEDIUM CLOUD RIGHT CLOSED E NO GROUND SMALL CLOUDS LEFT CLOSED F NO GROUND SMALL CLOUDS RIGHT CLOSED ---------------------------------------------- --------------------------------------------------------------------------- : NOTES: : --------------------------------------------------------------------------- : When using a 'Moving Ground with a Cloud' Floor Type (6 or 7), the : : Speed bits controls the Cloud's Speed as usual but the Moving Ground : : works a little different. The Ground is the fastest at 0 and seems to : : gradually get slower as you increase the Speed bits, when you hit 5 it : : starts to get faster again and at 7 it's just as fast as it was at 0. : --------------------------------------------------------------------------: : A screen can never have more than 2 Floors that use Clouds at the same : : time. : :-------------------------------------------------------------------------: -------------------------------------------------------------------------------- -- BONUS STAGE - PLATFORMS [PLAT] ---------------------------------------------- -------------------------------------------------------------------------------- There are a total of 8 unique Bonus Stages in the game. The Bonus Stages have room for 41 unique Platforms in the ROM and these may be shared amongst the 8 Stages. These Platforms are stored in 3 Tables. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The first Table is located at ROM: $32CA-$32F2 (CPU: $F2BA-$F2E2) [41 bytes] Each byte represents one Platform and the bits dictate if it should appear on the current Bonus Stage or not. The format looks like this: %1234 5678 An example: %1010 0001 = $A1